home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Creator Changer 2.7 / Code & Resource / GetFileIcon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-04  |  7.6 KB  |  356 lines  |  [TEXT/KAHL]

  1. #include    "GetFileIcon.h"
  2. #include    "Folders.h"
  3.  
  4.  
  5. pascal OSErr GetFileIcon(FSSpec *thing, IconSelectorValue iconSelector, Handle *theSuite)
  6.     {
  7.     
  8.     CInfoPBRec        cpb;
  9.     OSErr            err;
  10.  
  11.     *theSuite = NULL;
  12.  
  13.     if(IsVolEjected(thing->vRefNum)) err=volOffLinErr;
  14.     else
  15.         {
  16.         cpb.hFileInfo.ioVRefNum=thing->vRefNum;
  17.         cpb.hFileInfo.ioDirID=thing->parID;
  18.         cpb.hFileInfo.ioNamePtr=thing->name;
  19.         cpb.hFileInfo.ioFDirIndex=0;
  20.         err=PBGetCatInfoSync(&cpb);
  21.  
  22.         if(!err && (cpb.hFileInfo.ioFlAttrib & ioDirMask)==0) err=GetNormalFileIcon(&cpb, iconSelector, theSuite);
  23.         }
  24.     return(err);
  25.     }
  26.  
  27.  
  28.  
  29. static Boolean IsVolEjected(short vRefNum)
  30.     {
  31.     
  32.     OSErr            err;
  33.     HVolumeParam    vol_pb;
  34.     
  35.     vol_pb.ioNamePtr=NULL;
  36.     vol_pb.ioVRefNum=vRefNum;
  37.     vol_pb.ioVolIndex=0;
  38.     err=PBHGetVInfoSync((HParmBlkPtr)&vol_pb);
  39.     
  40.     return((err==noErr)&&(vol_pb.ioVDRefNum>0));
  41.     }
  42.  
  43.  
  44.  
  45. static OSErr GetNormalFileIcon(CInfoPBRec *cpb, IconSelectorValue iconSelector, Handle *theSuite)
  46.     {
  47.     OSErr            err;
  48.     long            dataSize;
  49.     Handle            iconData;
  50.     Byte            iconType;
  51.     GetIconData        getData;
  52.     short            iconID;
  53.     Boolean        inFinder;
  54.     short            saveResFile, FinderResFile, sysVRefNum;
  55.     long            sysDirID;
  56.     Str255            finderName;
  57.     IconActionUPP    getIconProcPtr;
  58.  
  59.     iconID=FindGenericIconID(cpb->hFileInfo.ioFlFndrInfo.fdType, &inFinder );
  60.     saveResFile=CurResFile();
  61.  
  62.     if(inFinder)
  63.         {
  64.         FindFolder(kOnSystemDisk, kSystemFolderType, kDontCreateFolder, &sysVRefNum, &sysDirID);
  65.         SetResLoad(false);
  66.         GetFinderFilename(finderName);
  67.         FinderResFile=HOpenResFile(sysVRefNum, sysDirID, finderName, fsRdPerm);
  68.         SetResLoad(true);
  69.         if(FinderResFile==-1) err=ResError();
  70.          else
  71.             {
  72.             err=GetResourceIcons(theSuite, iconID, iconSelector);
  73.             CloseResFile(FinderResFile);
  74.             }
  75.         }
  76.     else
  77.         {
  78.         getData.DTRefNum=FindDesktopDatabase(cpb->dirInfo.ioVRefNum, cpb->hFileInfo.ioFlFndrInfo.fdCreator);
  79.         if(getData.DTRefNum!=0)
  80.             {
  81.             err=NewIconSuite(theSuite);
  82.             if(!err)
  83.                 {
  84.                 getData.fileCreator    = cpb->hFileInfo.ioFlFndrInfo.fdCreator;
  85.                 getData.fileType    = cpb->hFileInfo.ioFlFndrInfo.fdType;
  86.                 if(getData.fileType == kApplicationAliasType) getData.fileType='APPL';
  87.                  getIconProcPtr=NewIconActionProc(GetIconProc);
  88.                 err=ForEachIconDo(*theSuite, iconSelector, getIconProcPtr, &getData);
  89.                 DisposeRoutineDescriptor(getIconProcPtr);
  90.                 }
  91.             }
  92.         if((getData.DTRefNum==0) || IsSuiteEmpty(*theSuite))
  93.             {
  94.             UseResFile(0);
  95.             err=GetResourceIcons(theSuite, iconID, iconSelector);
  96.             }
  97.         }
  98.     UseResFile(saveResFile);
  99.  
  100.     return(err);
  101.     }
  102.  
  103.  
  104.  
  105. static void GetFinderFilename(StringPtr _finderFilename)
  106.     {
  107.     
  108.     Str255        _defaultFinderFilename="\pFinder";
  109.     StringPtr    _lowMemFinderName;
  110.  
  111.     _lowMemFinderName = LMGetFinderName();
  112.     if((_lowMemFinderName!=(StringPtr)nil)&&(_lowMemFinderName[0]>0)) BlockMove(_lowMemFinderName, _finderFilename, _lowMemFinderName[0]+1);
  113.     else BlockMove(_defaultFinderFilename, _finderFilename, _defaultFinderFilename[0]+1);
  114.     }
  115.  
  116.  
  117.  
  118. static pascal OSErr GetIconProc(ResType theType, Handle *theIcon, void *yourDataPtr)
  119.     {
  120.     
  121.     OSErr            err;
  122.     GetIconData        *data;
  123.     DTPBRec            deskRec;
  124.  
  125.     err=noErr;
  126.     data=(GetIconData *)yourDataPtr;
  127.     *theIcon=NewHandle(kLarge8BitIconSize);
  128.  
  129.     if(!(*theIcon)) err=memFullErr;
  130.     else
  131.         {
  132.         HLock(*theIcon);
  133.     
  134.         deskRec.ioDTRefNum        = data->DTRefNum;
  135.         deskRec.ioDTBuffer        = **theIcon;
  136.         deskRec.ioDTReqCount    = kLarge8BitIconSize;
  137.         deskRec.ioFileCreator    = data->fileCreator;
  138.         deskRec.ioFileType        = data->fileType;
  139.     
  140.         switch(theType)
  141.             {
  142.             case large1BitMask:
  143.                 deskRec.ioIconType = kLargeIcon;
  144.                 break;
  145.             case large4BitData:
  146.                 deskRec.ioIconType = kLarge4BitIcon;
  147.                 break;
  148.             case large8BitData:
  149.                 deskRec.ioIconType = kLarge8BitIcon;
  150.                 break;
  151.             case small1BitMask:
  152.                 deskRec.ioIconType = kSmallIcon;
  153.                 break;
  154.             case small4BitData:
  155.                 deskRec.ioIconType = kSmall4BitIcon;
  156.                 break;
  157.             case small8BitData:
  158.                 deskRec.ioIconType = kSmall8BitIcon;
  159.                 break;
  160.             default:
  161.                 deskRec.ioIconType = 1000;
  162.                 break;
  163.             }
  164.  
  165.         err=PBDTGetIconSync(&deskRec);
  166.         if(err==noErr)
  167.             {
  168.             HUnlock(*theIcon);
  169.             SetHandleSize(*theIcon, deskRec.ioDTActCount);
  170.             }
  171.         else
  172.             {
  173.             DisposeHandle(*theIcon);
  174.             *theIcon=NULL;
  175.             err=noErr;
  176.             }
  177.         }
  178.     return(err);
  179.     }
  180.  
  181.  
  182.  
  183. static short FindDesktopDatabase(short firstVRefNum, OSType fileCreator)
  184.     {
  185.     
  186.     OSErr            err;
  187.     VolumeParam        vpb;
  188.     short            DTRefNum = 0;
  189.  
  190.     if(!InOneDesktop(firstVRefNum, fileCreator, &DTRefNum))
  191.         {
  192.         vpb.ioNamePtr=NULL;
  193.         for(vpb.ioVolIndex=1; PBGetVInfoSync((ParmBlkPtr)&vpb)==noErr; ++vpb.ioVolIndex)
  194.             {
  195.             if(vpb.ioVRefNum == firstVRefNum) continue;
  196.             if( InOneDesktop(vpb.ioVRefNum, fileCreator, &DTRefNum)) break;
  197.             }
  198.         }
  199.     return(DTRefNum);
  200.     }
  201.  
  202.  
  203.  
  204. static Boolean InOneDesktop(short vRefNum, OSType fileCreator, short *dtRefNum)
  205.     {
  206.     
  207.     OSErr        err;
  208.     DTPBRec        deskRec;
  209.     Boolean        retVal;
  210.     
  211.     HParamBlockRec         _myHPB;
  212.     GetVolParmsInfoBuffer  _infoBuffer;
  213.     
  214.     retVal=false;
  215.     deskRec.ioNamePtr=NULL;
  216.     deskRec.ioVRefNum=vRefNum;
  217.     
  218.     _myHPB.ioParam.ioNamePtr  = (StringPtr)nil;
  219.     _myHPB.ioParam.ioVRefNum  = vRefNum;
  220.     _myHPB.ioParam.ioBuffer   = (Ptr)&_infoBuffer;
  221.     _myHPB.ioParam.ioReqCount = sizeof(_infoBuffer);
  222.     if(((err=PBHGetVolParms(&_myHPB,false))!=noErr) || ((_infoBuffer.vMAttrib&(1L<<bHasDesktopMgr))==0)) return(retVal);
  223.     err=PBDTGetPath(&deskRec);
  224.     if(!err)
  225.         {
  226.         deskRec.ioFileCreator=fileCreator;
  227.         deskRec.ioIndex=1;
  228.         do
  229.             {
  230.             deskRec.ioTagInfo=0;
  231.             err=PBDTGetIconInfoSync(&deskRec);
  232.             deskRec.ioIndex+=1;
  233.             } while((err == noErr)&&(deskRec.ioIconType<=0));
  234.     
  235.         if(err==noErr)
  236.             {
  237.             retVal=true;
  238.             *dtRefNum=deskRec.ioDTRefNum;
  239.             }
  240.         }
  241.     return(retVal);
  242.     }
  243.  
  244.  
  245.  
  246. static pascal OSErr GetResourceIcons(Handle *theSuite, short theID, long theSelector)
  247.     {
  248.     
  249.     OSErr    err;
  250.     
  251.     err=Get1IconSuite(theSuite, theID, theSelector);
  252.     if(err == noErr) err=CopyEachIcon(*theSuite);
  253.     return(err);
  254.     }
  255.  
  256.  
  257.  
  258. static pascal OSErr CopyOneIcon(ResType theType, Handle *theIcon, void *yourDataPtr)
  259.     {
  260.     
  261.     OSErr    err;
  262.     
  263.     if(*theIcon!=NULL)
  264.         {
  265.         LoadResource(*theIcon);
  266.         err=HandToHand(theIcon);
  267.         if(err!=noErr) *theIcon=NULL;
  268.         }
  269.     return(noErr);
  270.     }
  271.  
  272.  
  273.  
  274. static OSErr CopyEachIcon(Handle theSuite)
  275.     {
  276.     IconActionUPP    copyOneIconProc;
  277.     OSErr            err;
  278.     
  279.     copyOneIconProc=NewIconActionProc(CopyOneIcon);
  280.     err=ForEachIconDo(theSuite, svAllAvailableData, copyOneIconProc, NULL);
  281.     DisposeRoutineDescriptor(copyOneIconProc);
  282.     return(err);
  283.     }
  284.  
  285.  
  286.  
  287. static short FindGenericIconID(OSType theType, Boolean *inFinder)
  288.     {
  289.     
  290.     short                 id=genericDocumentIconResource;
  291.     GenericIconInfo        *_icon, *_endIcon;
  292.    
  293.     for(_icon=gGenericFinderIcons, _endIcon=_icon+sizeof(gGenericFinderIcons)/sizeof(GenericIconInfo);(_icon<_endIcon)&&(_icon->type!=theType);_icon++);
  294.     if(!(*inFinder=(_icon<_endIcon)))
  295.         for(_icon=gGenericSysIcons, _endIcon=_icon+sizeof(gGenericSysIcons)/sizeof(GenericIconInfo);(_icon<_endIcon)&&(_icon->type!=theType); _icon++);
  296.     if(_icon<_endIcon) id=_icon->id;
  297.     return(id);
  298.     }
  299.  
  300.  
  301.  
  302. static pascal OSErr Get1IconSuite(Handle *theSuite, short theID, long theSelector)
  303.     {
  304.     
  305.     OSErr            err;
  306.     IconActionUPP    get1IconProc;
  307.  
  308.     err=NewIconSuite(theSuite);
  309.     if(!err)
  310.         {
  311.         get1IconProc=NewIconActionProc(Get1Icon);
  312.         err=ForEachIconDo(*theSuite, theSelector, get1IconProc, &theID);
  313.         DisposeRoutineDescriptor(get1IconProc);
  314.         }
  315.     return(err);
  316.     }
  317.  
  318.  
  319.  
  320. static pascal OSErr Get1Icon(ResType theType, Handle *theIcon, short *resID)
  321.     {
  322.     
  323.     *theIcon = Get1Resource(theType, *resID);
  324.  
  325.     return( noErr );
  326.     }
  327.  
  328.  
  329.  
  330. static pascal OSErr TestHandle(ResType theType, Handle *theIcon, void *yourDataPtr)
  331.     {
  332.     
  333.     if(*theIcon!=NULL) *(Boolean *)yourDataPtr=false;
  334.  
  335.     return( noErr );
  336.     }
  337.  
  338.  
  339.  
  340. Boolean IsSuiteEmpty(Handle theSuite)
  341.     {
  342.     
  343.     Boolean            retVal;
  344.     IconActionUPP    testHandleProc;
  345.  
  346.     testHandleProc=NewIconActionProc(TestHandle);
  347.     
  348.     retVal = true;
  349.     ForEachIconDo(theSuite, svAllAvailableData, testHandleProc, &retVal);
  350.     DisposeRoutineDescriptor(testHandleProc);
  351.  
  352.     return(retVal);
  353.     }
  354.  
  355.  
  356.